# coding: utf-8
'''
@autor1: João Batista nº5479
@autor2: Luis Cabaço nº5606
@data Inicio: 20/10/2012 - 16:00
@data Fim: 3/12/2012 - 11:49
@obs:

Interface grafica do programa
@fonte: http://docs.wxwidgets.org/2.8.9/wx_dialogfunctions.html#wxmessagebox
'''
import wx
import sys
import webbrowser
import os
import time

import bd_alchemy as bda
import controladorv2 as cv2

# begin wxGlade: extracode
# end wxGlade


class ProjectFrame(wx.Frame):

    def __init__(self, *args, **kwds):
        # begin wxGlade: ProjectFrame.__init__
        kwds["style"] = wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.SYSTEM_MENU | wx.FULL_REPAINT_ON_RESIZE | wx.CLIP_CHILDREN
        wx.Frame.__init__(self, *args, **kwds)

        # Menu Bar
        self.project_frame_menubar = wx.MenuBar()
        wxglade_tmp_menu = wx.Menu()
        wxglade_tmp_menu.Append(0101, "Criar Base de Dados", "", wx.ITEM_NORMAL)
        wxglade_tmp_menu.Append(0102, "Carregar Base de Dados", "", wx.ITEM_NORMAL)
        wxglade_tmp_menu.AppendSeparator()
        wxglade_tmp_menu.Append(0103, "Sair", "", wx.ITEM_NORMAL)
        self.project_frame_menubar.Append(wxglade_tmp_menu, "Ficheiro")
        wxglade_tmp_menu = wx.Menu()
        wxglade_tmp_menu.Append(0201, u"Informações", "", wx.ITEM_NORMAL)
        self.project_frame_menubar.Append(wxglade_tmp_menu, "Ajuda")
        self.SetMenuBar(self.project_frame_menubar)
        # Menu Bar end
        self.tabs_estatisticas = wx.Notebook(self, -1, style=0)
        self.tab_estatistica1 = wx.Panel(self.tabs_estatisticas, -1)
        self.e1_info = wx.StaticText(self.tab_estatistica1, -1, u"Esta estatística mostra os anos em que os cursos foram leccionados")
        self.e1_estabelecimento = wx.StaticText(self.tab_estatistica1, -1, "Estabelecimento de ensino:")
        self.e1_estabelecimento_combo = wx.ComboBox(self.tab_estatistica1, -1, choices=[], style=wx.CB_DROPDOWN | wx.CB_DROPDOWN | wx.CB_READONLY)
        self.e1_unidade = wx.StaticText(self.tab_estatistica1, -1, u"Unidade orgânica:")
        self.e1_unidade_combo = wx.ComboBox(self.tab_estatistica1, -1, choices=[], style=wx.CB_DROPDOWN | wx.CB_DROPDOWN | wx.CB_READONLY)
        self.e1_curso = wx.StaticText(self.tab_estatistica1, -1, "Curso superior:")
        self.e1_curso_combo = wx.ComboBox(self.tab_estatistica1, -1, choices=[], style=wx.CB_DROPDOWN | wx.CB_DROPDOWN | wx.CB_READONLY)
        self.e1_obter = wx.Button(self.tab_estatistica1, -1, "Obter resultados")
        self.e1_limpar = wx.Button(self.tab_estatistica1, -1, "Limpar")
        self.e1_cabecalho = wx.TextCtrl(self.tab_estatistica1, -1, "", style=wx.TE_READONLY)
        self.e1_resultados = wx.TextCtrl(self.tab_estatistica1, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL)
        self.e1_graficos = wx.StaticText(self.tab_estatistica1, -1, u"Gráficos:", style=wx.ALIGN_CENTRE)
        self.e1_grafico_barras = wx.RadioButton(self.tab_estatistica1, -1, u"gráfico de barras")
        self.e1_grafico_circular = wx.RadioButton(self.tab_estatistica1, -1, u"gráfico circular")
        self.e1_ver_grafico = wx.Button(self.tab_estatistica1, -1, "Ver")
        self.e1_linha = wx.StaticLine(self.tab_estatistica1, -1, style=wx.LI_VERTICAL)
        self.e1_csv = wx.Button(self.tab_estatistica1, -1, "Criar CSV")
        self.tab_estatistica2 = wx.Panel(self.tabs_estatisticas, -1)
        self.e2_info = wx.StaticText(self.tab_estatistica2, -1, u"Esta estatística mostra a quanditade de alunos inscritos por ano, em determinado curso")
        self.e2_curso = wx.StaticText(self.tab_estatistica2, -1, "Curso superior:")
        self.e2_curso_combo = wx.ComboBox(self.tab_estatistica2, -1, choices=[], style=wx.CB_DROPDOWN | wx.CB_DROPDOWN | wx.CB_READONLY)
        self.e2_obter = wx.Button(self.tab_estatistica2, -1, "Obter resultados")
        self.e2_limpar = wx.Button(self.tab_estatistica2, -1, "Limpar")
        self.e2_cabecalho = wx.TextCtrl(self.tab_estatistica2, -1, "", style=wx.TE_READONLY)
        self.e2_resultados = wx.TextCtrl(self.tab_estatistica2, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL)
        self.e2_graficos = wx.StaticText(self.tab_estatistica2, -1, u"Gráficos:", style=wx.ALIGN_CENTRE)
        self.e2_grafico_barras = wx.RadioButton(self.tab_estatistica2, -1, u"gráfico de barras")
        self.e2_grafico_circular = wx.RadioButton(self.tab_estatistica2, -1, u"gráfico circular")
        self.e2_ver = wx.Button(self.tab_estatistica2, -1, "Ver")
        self.e2_linha = wx.StaticLine(self.tab_estatistica2, -1, style=wx.LI_VERTICAL)
        self.e2_csv = wx.Button(self.tab_estatistica2, -1, "Criar CSV")
        self.tab_estatistica3 = wx.Panel(self.tabs_estatisticas, -1)
        self.e3_info = wx.StaticText(self.tab_estatistica3, -1, u"Esta estatística mostra a quanditade cursos leccionados por nível de formação ao longo dos anos")
        self.e3_nivel_formacao = wx.StaticText(self.tab_estatistica3, -1, u"Nível de formação:")
        self.e3_nivel_formacao_combo = wx.ComboBox(self.tab_estatistica3, -1, choices=[], style=wx.CB_DROPDOWN | wx.CB_DROPDOWN | wx.CB_READONLY)
        self.e3_obter = wx.Button(self.tab_estatistica3, -1, "Obter resultados")
        self.e3_limpar = wx.Button(self.tab_estatistica3, -1, "Limpar")
        self.e3_cabecalho = wx.TextCtrl(self.tab_estatistica3, -1, "", style=wx.TE_READONLY)
        self.e3_resultados = wx.TextCtrl(self.tab_estatistica3, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL)
        self.e3_graficos = wx.StaticText(self.tab_estatistica3, -1, u"Gráficos:", style=wx.ALIGN_CENTRE)
        self.e3_grafico_barras = wx.RadioButton(self.tab_estatistica3, -1, u"gráfico de barras")
        self.e3_grafico_circular = wx.RadioButton(self.tab_estatistica3, -1, u"gráfico circular")
        self.e3_ver = wx.Button(self.tab_estatistica3, -1, "Ver")
        self.e3_linha = wx.StaticLine(self.tab_estatistica3, -1, style=wx.LI_VERTICAL)
        self.e3_csv = wx.Button(self.tab_estatistica3, -1, "Criar CSV")
        self.tab_estatistica4 = wx.Panel(self.tabs_estatisticas, -1)
        self.e4_info = wx.StaticText(self.tab_estatistica4, -1, u"Esta estatística mostra a quanditade de alunos por nível de formação ao longo dos anos")
        self.e4_nivel_formacao = wx.StaticText(self.tab_estatistica4, -1, u"Nível de formação:")
        self.e4_nivel_formacao_combo = wx.ComboBox(self.tab_estatistica4, -1, choices=[], style=wx.CB_DROPDOWN | wx.CB_DROPDOWN | wx.CB_READONLY)
        self.e4_obter = wx.Button(self.tab_estatistica4, -1, "Obter resultados")
        self.e4_limpar = wx.Button(self.tab_estatistica4, -1, "Limpar")
        self.e4_cabecalho = wx.TextCtrl(self.tab_estatistica4, -1, "", style=wx.TE_READONLY)
        self.e4_resultados = wx.TextCtrl(self.tab_estatistica4, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL)
        self.e4_graficos = wx.StaticText(self.tab_estatistica4, -1, u"Gráficos:", style=wx.ALIGN_CENTRE)
        self.e4_grafico_barras = wx.RadioButton(self.tab_estatistica4, -1, u"gráfico de barras")
        self.e4_grafico_circular = wx.RadioButton(self.tab_estatistica4, -1, u"gráfico circular")
        self.e4_ver = wx.Button(self.tab_estatistica4, -1, "Ver")
        self.e4_linha = wx.StaticLine(self.tab_estatistica4, -1, style=wx.LI_VERTICAL)
        self.e4_csv = wx.Button(self.tab_estatistica4, -1, "Criar CSV")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_MENU, self.evt_criar_bd, id=0101)
        self.Bind(wx.EVT_MENU, self.evt_carregar_bd, id=0102)
        self.Bind(wx.EVT_MENU, self.evt_sair, id=0103)
        self.Bind(wx.EVT_MENU, self.evt_informacoes, id=0201)
        self.Bind(wx.EVT_COMBOBOX, self.evt_e1_combo_estabelecimento_selec, self.e1_estabelecimento_combo)
        self.Bind(wx.EVT_COMBOBOX, self.evt_e1_unidade_selec, self.e1_unidade_combo)
        self.Bind(wx.EVT_BUTTON, self.evt_e1_obter, self.e1_obter)
        self.Bind(wx.EVT_BUTTON, self.evt_e1_limpar, self.e1_limpar)
        self.Bind(wx.EVT_BUTTON, self.evt_e1_csv, self.e1_csv)
        self.Bind(wx.EVT_BUTTON, self.evt_e2_obter, self.e2_obter)
        self.Bind(wx.EVT_BUTTON, self.evt_e2_limpar, self.e2_limpar)
        self.Bind(wx.EVT_BUTTON, self.evt_e2_ver, self.e2_ver)
        self.Bind(wx.EVT_BUTTON, self.evt_e2_csv, self.e2_csv)
        self.Bind(wx.EVT_BUTTON, self.evt_e3_obter, self.e3_obter)
        self.Bind(wx.EVT_BUTTON, self.evt_e3_limpar, self.e3_limpar)
        self.Bind(wx.EVT_BUTTON, self.evt_e3_ver, self.e3_ver)
        self.Bind(wx.EVT_BUTTON, self.evt_e3_csv, self.e3_csv)
        self.Bind(wx.EVT_BUTTON, self.evt_e4_obter, self.e4_obter)
        self.Bind(wx.EVT_BUTTON, self.evt_e4_limpar, self.e4_limpar)
        self.Bind(wx.EVT_BUTTON, self.evt_e4_ver, self.e4_ver)
        self.Bind(wx.EVT_BUTTON, self.evt_e4_csv, self.e4_csv)
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: ProjectFrame.__set_properties
        self.SetTitle("LP - Estatisticas dos Inscritos no Ensino Superio de 95/96 a 10/11")
        _icon = wx.EmptyIcon()
        _icon.CopyFromBitmap(wx.Bitmap("logo2.png", wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.SetSize((1005, 600))
        self.e1_estabelecimento_combo.SetMinSize((600, 25))
        self.e1_unidade_combo.SetMinSize((600, 25))
        self.e1_curso_combo.SetMinSize((600, 25))
        self.e1_cabecalho.SetMinSize((999, 25))
        self.e1_resultados.SetMinSize((999, 290))
        self.e1_grafico_barras.Enable(False)
        self.e1_grafico_circular.Enable(False)
        self.e1_ver_grafico.Enable(False)
        self.e2_grafico_barras.Enable(False)
        self.e2_grafico_circular.Enable(False)
        self.e2_ver.Enable(False)
        self.e3_grafico_barras.Enable(False)
        self.e3_grafico_circular.Enable(False)
        self.e3_ver.Enable(False)
        self.e4_grafico_barras.Enable(False)
        self.e4_grafico_circular.Enable(False)
        self.e4_ver.Enable(False)
        self.e1_obter.Enable(False)
        self.e2_obter.Enable(False)
        self.e3_obter.Enable(False)
        self.e4_obter.Enable(False)
        self.e1_csv.Enable(False)
        self.e2_csv.Enable(False)
        self.e3_csv.Enable(False)
        self.e4_csv.Enable(False)
        self.tab_estatistica1.SetMinSize((1008, 540))
        self.e2_curso_combo.SetMinSize((600, 25))
        self.e2_cabecalho.SetMinSize((999, 25))
        self.e2_resultados.SetMinSize((999, 342))
        self.e3_nivel_formacao_combo.SetMinSize((600, 25))
        self.e3_cabecalho.SetMinSize((999, 25))
        self.e3_resultados.SetMinSize((999, 342))
        self.e4_nivel_formacao_combo.SetMinSize((600, 25))
        self.e4_cabecalho.SetMinSize((999, 25))
        self.e4_resultados.SetMinSize((999, 342))
        self.tabs_estatisticas.SetMinSize((600, 25))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: ProjectFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_18 = wx.BoxSizer(wx.VERTICAL)
        sizer_22 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_26_copy_copy_1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_21 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_20 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_19 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_13 = wx.BoxSizer(wx.VERTICAL)
        sizer_17 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_26_copy_copy = wx.BoxSizer(wx.HORIZONTAL)
        sizer_16 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_15 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_14 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_26_copy = wx.BoxSizer(wx.HORIZONTAL)
        sizer_11 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_26 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_23 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_24 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_25 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3.Add(self.e1_info, 0, wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 10)
        sizer_2.Add(sizer_3, 0, wx.LEFT | wx.EXPAND, 250)
        sizer_4.Add(self.e1_estabelecimento, 0, wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        sizer_4.Add(self.e1_estabelecimento_combo, 0, wx.RIGHT | wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 18)
        sizer_2.Add(sizer_4, 0, wx.LEFT | wx.SHAPED, 50)
        sizer_24.Add(self.e1_unidade, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 4)
        sizer_25.Add(self.e1_unidade_combo, 0, wx.LEFT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        sizer_24.Add(sizer_25, 0, wx.EXPAND, 0)
        sizer_23.Add(sizer_24, 0, wx.LEFT | wx.EXPAND, 46)
        sizer_2.Add(sizer_23, 0, wx.LEFT | wx.TOP | wx.EXPAND, 4)
        sizer_5.Add(self.e1_curso, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_5.Add(self.e1_curso_combo, 0, wx.LEFT | wx.TOP, 4)
        sizer_2.Add(sizer_5, 0, wx.LEFT | wx.EXPAND, 50)
        sizer_7.Add(self.e1_obter, 0, wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 30)
        sizer_7.Add(self.e1_limpar, 0, wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 15)
        sizer_2.Add(sizer_7, 0, wx.LEFT | wx.EXPAND, 350)
        sizer_26.Add(self.e1_cabecalho, 0, wx.BOTTOM | wx.EXPAND, 5)
        sizer_2.Add(sizer_26, 0, wx.EXPAND, 0)
        sizer_2.Add(self.e1_resultados, 0, 0, 0)
        sizer_6.Add(self.e1_graficos, 0, wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 11)
        sizer_6.Add(self.e1_grafico_barras, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_6.Add(self.e1_grafico_circular, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_6.Add(self.e1_ver_grafico, 0, wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        sizer_6.Add(self.e1_linha, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 15)
        sizer_6.Add(self.e1_csv, 0, wx.LEFT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 200)
        sizer_2.Add(sizer_6, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0)
        self.tab_estatistica1.SetSizer(sizer_2)
        sizer_9.Add(self.e2_info, 0, wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 10)
        sizer_8.Add(sizer_9, 0, wx.LEFT | wx.EXPAND, 210)
        sizer_10.Add(self.e2_curso, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_10.Add(self.e2_curso_combo, 0, wx.LEFT | wx.TOP, 5)
        sizer_8.Add(sizer_10, 0, wx.LEFT | wx.EXPAND, 50)
        sizer_11.Add(self.e2_obter, 0, wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 30)
        sizer_11.Add(self.e2_limpar, 0, wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 15)
        sizer_8.Add(sizer_11, 0, wx.LEFT | wx.EXPAND, 350)
        sizer_26_copy.Add(self.e2_cabecalho, 0, wx.BOTTOM, 5)
        sizer_8.Add(sizer_26_copy, 0, wx.EXPAND, 0)
        sizer_8.Add(self.e2_resultados, 0, 0, 0)
        sizer_12.Add(self.e2_graficos, 0, wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 11)
        sizer_12.Add(self.e2_grafico_barras, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_12.Add(self.e2_grafico_circular, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_12.Add(self.e2_ver, 0, wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        sizer_12.Add(self.e2_linha, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 15)
        sizer_12.Add(self.e2_csv, 0, wx.LEFT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 200)
        sizer_8.Add(sizer_12, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0)
        self.tab_estatistica2.SetSizer(sizer_8)
        sizer_14.Add(self.e3_info, 0, wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 10)
        sizer_13.Add(sizer_14, 0, wx.LEFT | wx.EXPAND, 160)
        sizer_15.Add(self.e3_nivel_formacao, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_15.Add(self.e3_nivel_formacao_combo, 0, wx.LEFT | wx.TOP, 5)
        sizer_13.Add(sizer_15, 0, wx.LEFT | wx.EXPAND, 50)
        sizer_16.Add(self.e3_obter, 0, wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 30)
        sizer_16.Add(self.e3_limpar, 0, wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 15)
        sizer_13.Add(sizer_16, 0, wx.LEFT | wx.EXPAND, 350)
        sizer_26_copy_copy.Add(self.e3_cabecalho, 0, wx.BOTTOM, 5)
        sizer_13.Add(sizer_26_copy_copy, 0, wx.EXPAND, 0)
        sizer_13.Add(self.e3_resultados, 0, 0, 0)
        sizer_17.Add(self.e3_graficos, 0, wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 11)
        sizer_17.Add(self.e3_grafico_barras, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_17.Add(self.e3_grafico_circular, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_17.Add(self.e3_ver, 0, wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        sizer_17.Add(self.e3_linha, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 15)
        sizer_17.Add(self.e3_csv, 0, wx.LEFT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 200)
        sizer_13.Add(sizer_17, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0)
        self.tab_estatistica3.SetSizer(sizer_13)
        sizer_19.Add(self.e4_info, 0, wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 10)
        sizer_18.Add(sizer_19, 0, wx.LEFT | wx.EXPAND, 180)
        sizer_20.Add(self.e4_nivel_formacao, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_20.Add(self.e4_nivel_formacao_combo, 0, wx.LEFT | wx.TOP, 5)
        sizer_18.Add(sizer_20, 0, wx.LEFT | wx.EXPAND, 50)
        sizer_21.Add(self.e4_obter, 0, wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 30)
        sizer_21.Add(self.e4_limpar, 0, wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 15)
        sizer_18.Add(sizer_21, 0, wx.LEFT | wx.EXPAND, 350)
        sizer_26_copy_copy_1.Add(self.e4_cabecalho, 0, wx.BOTTOM, 5)
        sizer_18.Add(sizer_26_copy_copy_1, 0, wx.EXPAND, 0)
        sizer_18.Add(self.e4_resultados, 0, 0, 0)
        sizer_22.Add(self.e4_graficos, 0, wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 11)
        sizer_22.Add(self.e4_grafico_barras, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_22.Add(self.e4_grafico_circular, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_22.Add(self.e4_ver, 0, wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 5)
        sizer_22.Add(self.e4_linha, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 15)
        sizer_22.Add(self.e4_csv, 0, wx.LEFT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 200)
        sizer_18.Add(sizer_22, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 0)
        self.tab_estatistica4.SetSizer(sizer_18)
        self.tabs_estatisticas.AddPage(self.tab_estatistica1, u"Estatítsica 1")
        self.tabs_estatisticas.AddPage(self.tab_estatistica2, u"Estatística 2")
        self.tabs_estatisticas.AddPage(self.tab_estatistica3, u"Estatística 3")
        self.tabs_estatisticas.AddPage(self.tab_estatistica4, u"Estatística 4")
        sizer_1.Add(self.tabs_estatisticas, 2, wx.EXPAND, 50)
        self.SetSizer(sizer_1)
        self.Layout()
        self.Centre()
        # end wxGlade

    ''' Eventos '''
    # terminar o programa
    def evt_sair(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Termina o programa
        '''
        msg_sair = wx.MessageBox('Deseja mesmo sair?', 'Sair', 
                       wx.YES_NO | wx.ICON_QUESTION)

        if msg_sair == wx.YES:
            self.Destroy()
            sys.exit()
            pass

    # abrir ficheiro (html) com a ajuda 
    def evt_informacoes(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Abre a ajuda numa janela do browser
        '''
        
        webbrowser.open("Ajuda.html")
        event.Skip()

    # selecionar o estabelecimento 
    #de ensino para a estatistica 1
    def evt_e1_combo_estabelecimento_selec(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                ao seleccionar escola vai buscar as unidades organicas dela e actualiza a combo das unidades            
        '''
        self.e1_unidade_combo.SetValue('')
        self.e1_unidade_combo.Clear()
        self.e1_curso_combo.SetValue('')
        self.e1_curso_combo.Clear()

        seleccionado = self.e1_estabelecimento_combo.GetValue()
        lista_unidades = obj_cv2.estatistica_um_buscar_unidades(seleccionado)

        self.e1_unidade_combo.AppendItems(lista_unidades)

        event.Skip()

    # selecionar a unidade organica
    # para a estatistica 1
    def evt_e1_unidade_selec(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                ao seleccionar a unidade organica vai buscar os cursos dela e actualiza a combo dos cursos
        '''
        self.e1_curso_combo.SetValue('')
        self.e1_curso_combo.Clear()

        seleccionado = self.e1_estabelecimento_combo.GetValue()
        seleccionado2 = self.e1_unidade_combo.GetValue()

        lista_cursos = obj_cv2.estatistica_um_buscar_cursos(seleccionado, seleccionado2)

        self.e1_curso_combo.AppendItems(lista_cursos)

        event.Skip()

    # Apresentar resultados para a estatistica 1
    def evt_e1_obter(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Obtem os resultados de acordo com o escolhido na interface
        '''
        self.e1_resultados.Clear() 
        self.e1_cabecalho.Clear()
        
        #resultado_e1 = []

        estabelecimento_e1 = self.e1_estabelecimento_combo.GetValue()
        unidade_e1 = self.e1_unidade_combo.GetValue()
        
        t1 = time.time()

        curso_e1 = self.e1_curso_combo.GetValue()
        dados_e1 = obj_cv2.calcular_estatistica_um(estabelecimento_e1, unidade_e1, curso_e1)

        resultado_e1 = dados_e1[1]

        cabecalho = " | ".join(dados_e1[0])
        self.e1_cabecalho.AppendText(cabecalho)

        for linha in resultado_e1:
            linha_texto = (' | '.join(linha))
            linha_texto += '\n'
            self.e1_resultados.AppendText(linha_texto)
            pass

            self.e1_csv.Enable(True)

        t2 = time.time()
        print "tempo estatistica1: ", t2 - t1

        event.Skip()

    # Limpar resultados de estatistica 1
    def evt_e1_limpar(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Limpa as combos e caixa de resutlados da estatistica um
        '''
        self.e1_resultados.Clear()
        self.e1_unidade_combo.Clear()
        self.e1_unidade_combo.SetValue('')
        self.e1_curso_combo.Clear()
        self.e1_curso_combo.SetValue('')
        self.e1_estabelecimento_combo.SetValue('')
        self.e1_cabecalho.Clear()

        self.e1_grafico_barras.Enable(False)
        self.e1_grafico_circular.Enable(False)
        self.e1_ver_grafico.Enable(False)
        self.e1_csv.Enable(False)
        event.Skip()

    # Criar ficheiro CSV para a estatistica 1
    def evt_e1_csv(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Cria o csv com os resultados da estatistica 1
        '''
        resultado_local = part_mem.get_resultado_estatisticas(1)
        extencao = ".csv"
        nome_ficheiro = "e1"
        cabecalho = resultado_local[0]
        lista = resultado_local[1]

        estabelecimento_e1 = self.e1_estabelecimento_combo.GetValue()
        unidade_e1 = self.e1_unidade_combo.GetValue()
        curso_e1 = self.e1_curso_combo.GetValue()

        if estabelecimento_e1 != '':
            nome_ficheiro += '_' + estabelecimento_e1
           
            if unidade_e1 != '':
                nome_ficheiro += '_' + unidade_e1

                if curso_e1 != '':
                    nome_ficheiro += '_' + curso_e1
                    pass
                pass
            pass

        nome_ficheiro += extencao

        mensagem = obj_cv2.criar_csv(nome_ficheiro, cabecalho, lista)

        msg_csv = wx.MessageBox(mensagem, 'Info', 
                                 wx.OK | wx.ICON_INFORMATION)

        event.Skip()

    # Apresentar resultados para a estatistica 2
    def evt_e2_obter(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Apresenta os resultados de acordo com o escolhido na interface
        '''
        self.e2_cabecalho.Clear()
        self.e2_resultados.Clear()
        
        t1 = time.time()

        curso_e2 = self.e2_curso_combo.GetValue()
        dados_e2 = obj_cv2.calcular_estatistica_dois(curso_e2)

        resultado_e2_encoded = []

        resultado_e2 = dados_e2[1]
        
        cabecalho = " | ".join(dados_e2[0])
        self.e2_cabecalho.AppendText(cabecalho)
        
        linha_resultado_ints = ''

        for linha_d in resultado_e2:
            lista_temp = ''
            
            #caso sejam numeros o tratamento tem de ser diferente
            if isinstance(linha_d, int):
                linha_resultado_ints += str(linha_d) + " | "
                pass

            else:
                for elemento_d in linha_d: 
                    lista_temp+= str(elemento_d) + " | "
                    pass

                lista_temp += "\n"
                resultado_e2_encoded.append(lista_temp)
                del lista_temp
                pass

        if linha_resultado_ints != '':
            self.e2_grafico_barras.Enable(True)
            self.e2_grafico_circular.Enable(True)
            self.e2_ver.Enable(True)
            resultado_e2_encoded.append(linha_resultado_ints)
            pass
       

        for linha in resultado_e2_encoded:
            self.e2_resultados.AppendText(linha)
            pass

        self.e2_csv.Enable(True)

        t2 = time.time()
        print "tempo estatistica2: ", t2 - t1

        event.Skip()

    # limpar resultados da estatistica 2
    def evt_e2_limpar(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Limpa as combos e caixa de resultados
        '''
        self.e2_resultados.Clear()
        self.e2_curso_combo.SetValue("")
        self.e2_cabecalho.Clear()

        self.e2_grafico_barras.Enable(False)
        self.e2_grafico_circular.Enable(False)
        self.e2_ver.Enable(False)
        self.e2_csv.Enable(False)
        event.Skip()

    # Ver grafico da estatistica 2
    def evt_e2_ver(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Cria o gráfico de acordo com o que é apresentado na interface
        '''
        resultado_local = part_mem.get_resultado_estatisticas(2)
        cabecalho = [self.e2_curso_combo.GetValue().encode("utf-8")]
        cabecalho += ["alunos"]
        cabecalho += resultado_local[0]
        lista = resultado_local[1]

        if self.e2_grafico_barras.GetValue() == True:
            tipo_grafico = 1
            pass
        else:
            tipo_grafico = 2
            pass
            
        self.e2_ver.Enable(False)
        self.e3_ver.Enable(False)
        self.e4_ver.Enable(False)
        obj_cv2.criar_grafico_threaded(tipo_grafico, cabecalho, lista)

        event.Skip()

    # Criar ficheiro CSV com os dados da estatistica 2
    def evt_e2_csv(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Cria o csv de acordo com os resultados obtidos na interface
        '''
        resultado_local = part_mem.get_resultado_estatisticas(2)
        nome_ficheiro = "e2"
        extencao = ".csv"
        cabecalho = resultado_local[0]
        lista = resultado_local[1]

        curso_e2 = self.e2_curso_combo.GetValue()

        if curso_e2 != '':
            nome_ficheiro += '_' + curso_e2
            pass

        nome_ficheiro += extencao

        mensagem = obj_cv2.criar_csv(nome_ficheiro, cabecalho, lista)

        msg_csv = wx.MessageBox(mensagem, 'Info', 
                                 wx.OK | wx.ICON_INFORMATION)

        event.Skip()

    # Mostrar resultado da estatistica 3
    def evt_e3_obter(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Calcula os resultados de acordo com o escolhido na interface
        '''
        self.e3_cabecalho.Clear()
        self.e3_resultados.Clear()

        t1 = time.time()

        nivel_e3 = self.e3_nivel_formacao_combo.GetValue()
        dados_e3 = obj_cv2.calcular_estatistica_tres(nivel_e3)

        resultado_e3_encoded = []

        resultado_e3 = dados_e3[1]
        
        cabecalho = " | ".join(dados_e3[0])
        self.e3_cabecalho.AppendText(cabecalho)

        linha_resultado_ints = ''

        for linha_d in resultado_e3:
            lista_temp = ''
            
            #caso sejam numeros o tratamento tem de ser diferente
            if isinstance(linha_d, int):
                linha_resultado_ints += str(linha_d) + " | "
                pass

            else:
                for elemento_d in linha_d: 
                    lista_temp+= str(elemento_d) + " | "
                    pass

                lista_temp += "\n"
                resultado_e3_encoded.append(lista_temp)
                del lista_temp
                pass

        if linha_resultado_ints != '':
            self.e3_grafico_barras.Enable(True)
            self.e3_grafico_circular.Enable(True)
            self.e3_ver.Enable(True)
            resultado_e3_encoded.append(linha_resultado_ints)
            pass
       

        for linha in resultado_e3_encoded:
            self.e3_resultados.AppendText(linha)
            pass

        self.e3_csv.Enable(True)


        t2 = time.time()
        print "tempo estatistica3: ", t2 - t1

        event.Skip()

    # limpar dados da estatistica 3
    def evt_e3_limpar(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Limpa as combos e caixa de resultados da estatistica 3
        '''
        self.e3_cabecalho.Clear()
        self.e3_resultados.Clear()
        self.e3_nivel_formacao_combo.SetValue("")

        self.e3_grafico_barras.Enable(False)
        self.e3_grafico_circular.Enable(False)
        self.e3_ver.Enable(False)
        self.e3_csv.Enable(False)

        event.Skip()

    # Ver o grafico da estatistica 3
    def evt_e3_ver(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Cria os gráficos de acordo com os dados apresentados referentes à estatistica 3
        '''
        resultado_local = part_mem.get_resultado_estatisticas(3)
        cabecalho = [self.e3_nivel_formacao_combo.GetValue().encode("utf-8")]
        cabecalho += ["cursos"]
        cabecalho += resultado_local[0]
        lista = resultado_local[1]

        if self.e3_grafico_barras.GetValue() == True:
            tipo_grafico = 1
            pass
        else:
            tipo_grafico = 2
            pass
            
        self.e2_ver.Enable(False)
        self.e3_ver.Enable(False)
        self.e4_ver.Enable(False)
        obj_cv2.criar_grafico_threaded(tipo_grafico, cabecalho, lista)
        event.Skip()

    # Criar o ficheiro CSV para a estatistica 3
    def evt_e3_csv(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Cria o csv de acordo com os dados apresentados na estatistica 3
        '''
        resultado_local = part_mem.get_resultado_estatisticas(3)
        nome_ficheiro = "e3"
        cabecalho = resultado_local[0]
        lista = resultado_local[1]

        nivel_e3 = self.e3_nivel_formacao_combo.GetValue()

        extencao = ".csv"
        if nivel_e3 != '':
            nome_ficheiro += '_' + nivel_e3
            pass

        nome_ficheiro += extencao

        mensagem = obj_cv2.criar_csv(nome_ficheiro, cabecalho, lista)

        msg_csv = wx.MessageBox(mensagem, 'Info', 
                                 wx.OK | wx.ICON_INFORMATION)
        event.Skip()


    # Mostrar resultado da estatistica 4
    def evt_e4_obter(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Apresenta o resultado da estatistica 4
        '''
        self.e4_cabecalho.Clear()
        self.e4_resultados.Clear()

        t1 = time.time()

        nivel_e4 = self.e4_nivel_formacao_combo.GetValue()

        dados_e4 = obj_cv2.calcular_estatistica_quatro(nivel_e4)

        resultado_e4_encoded = []

        resultado_e4 = dados_e4[1]
        
        cabecalho = " | ".join(dados_e4[0])
        self.e4_cabecalho.AppendText(cabecalho)

        linha_resultado_ints = ''

        for linha_d in resultado_e4:
            lista_temp = ''
            
            #caso sejam numeros o tratamento tem de ser diferente
            if isinstance(linha_d, int):
                linha_resultado_ints += str(linha_d) + " | "
                pass

            else:
                for elemento_d in linha_d: 
                    lista_temp+= str(elemento_d) + " | "
                    pass

                lista_temp += "\n"
                resultado_e4_encoded.append(lista_temp)
                del lista_temp
                pass

        if linha_resultado_ints != '':
            self.e4_grafico_barras.Enable(True)
            self.e4_grafico_circular.Enable(True)
            self.e4_ver.Enable(True)
            resultado_e4_encoded.append(linha_resultado_ints)
            pass
       

        for linha in resultado_e4_encoded:
            self.e4_resultados.AppendText(linha)
            pass

        self.e4_csv.Enable(True)


        t2 = time.time()
        print "tempo estatistica4: ", t2 - t1

        event.Skip()

    # limpar resultados da estatistica 4
    def evt_e4_limpar(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição: 
                Trata o evento da estatistica 4 para limpar as combos
        '''
        self.e4_resultados.Clear()
        self.e4_nivel_formacao_combo.SetValue("")
        self.e4_cabecalho.Clear()
       
        self.e4_grafico_barras.Enable(False)
        self.e4_grafico_circular.Enable(False)
        self.e4_ver.Enable(False)
        self.e4_csv.Enable(False)
        event.Skip()

    # Ver o grafico da estatistica 4
    def evt_e4_ver(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Evento que cria o gráfico para a estatistica 4
        '''
        resultado_local = part_mem.get_resultado_estatisticas(4)
        cabecalho = [self.e4_nivel_formacao_combo.GetValue().encode("utf-8")]
        cabecalho += ["alunos"]
        cabecalho += resultado_local[0]
        lista = resultado_local[1]

        if self.e4_grafico_barras.GetValue() == True:
            tipo_grafico = 1
            pass
        else:
            tipo_grafico = 2
            pass

        self.e2_ver.Enable(False)
        self.e3_ver.Enable(False)
        self.e4_ver.Enable(False)
        obj_cv2.criar_grafico_threaded(tipo_grafico, cabecalho, lista)
        event.Skip()

    # Criar ficheiro CSV com os dados da estatistica 4
    def evt_e4_csv(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição: 
                Eventro que cria o csv com os dados referentes à estatistica 4
        '''
        resultado_local = part_mem.get_resultado_estatisticas(4)
        nome_ficheiro = "e4"
        extencao = ".csv"
        cabecalho = resultado_local[0]
        lista = resultado_local[1]

        nivel_e4 = self.e4_nivel_formacao_combo.GetValue()

        if nivel_e4 != '':
            nome_ficheiro += '_' + nivel_e4
            pass

        nome_ficheiro += extencao

        mensagem = obj_cv2.criar_csv(nome_ficheiro, cabecalho, lista)

        msg_csv = wx.MessageBox(mensagem, 'Info', 
                                 wx.OK | wx.ICON_INFORMATION)
        event.Skip()

    # Carregar os dados da Base de Dados
    def evt_carregar_bd(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                Evento para carregar a base de dados conforme a existencia de threads
        '''
        if enable_threads == 'threaded':
            self.carregar_bd_thread()
            pass
        else:
            self.carregar_bd()
            pass
        pass

    # Criar o ficheiro da Base de Dados
    def evt_criar_bd(self, event):  # wxGlade: ProjectFrame.<event_handler>
        '''
            Descrição:
                evento que trata a criação da base de dados conforme a existencia de threads
        '''
        if enable_threads == 'threaded':
            self.inicializacao_bd_thread()
            pass
        else:
            self.inicializacao_bd()
            pass
        pass

    def openfile(self):
        '''
            Descrição:
                Metodo que abre uma caixa de dialogo para carregar um ficheiro
                fonte: http://wiki.wxpython.org/AnotherTutorial

            Returns:
                Caminho do ficheiro a carregar
        '''
        dlg = wx.FileDialog(self, "Escolha o ficheiro .xls", os.getcwd(), "", "*.xls", wx.OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
        dlg.Destroy()
        return path
        pass


    def carregar_bd(self):
        '''
            Descrição:
                Metodo para carregar a base de dados sem recorrer a threads

            Raises:
                IOError: Para o caso de não existir base de dados

        '''
        try:
            open('lp_python_1213.db')

        except IOError:
            msg_csv = wx.MessageBox('Crie a base de dados antes de carregar.', 'Info', wx.OK | wx.ICON_INFORMATION)
            pass

        else:
            obj_cv2.carregar_base_dados_v2()   

            mensagem = part_mem.get_mensagem()
            msg_csv = wx.MessageBox(mensagem, 'Info', wx.OK | wx.ICON_INFORMATION)

            self.inicializacao_combos()
            pass

    def carregar_bd_thread(self):
        '''
            Descrição:
                Metodo para carregar a base de dados recorrendo a threads

            Raises:
                IOError: Para o caso de não existir base de dados.
        '''
        try:
            open('lp_python_1213.db')

        except IOError:
            msg_csv = wx.MessageBox('Crie a base de dados antes de carregar.', 'Info', wx.OK | wx.ICON_INFORMATION)
            pass

        else:
            obj_cv2.carregar_base_dados_thread()

            progressMax = 11957
            dialog = wx.ProgressDialog("A carregar bd", "Tempo restante", progressMax,
                    style= wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_REMAINING_TIME)
            keepGoing = True
            count = part_mem.get_status()
            while keepGoing and count < progressMax:             
                if count < progressMax:
                    count_temp = part_mem.get_status()
                    if count_temp == 0:
                        count = count + 1
                        keepGoing = dialog.Update(count)
                        pass
                    else:
                        count = part_mem.get_status()
                        keepGoing = dialog.Update(count)
                        pass
                    pass
                pass

            else:
                dialog.Destroy()
                pass

            if count == progressMax:
                mensagem = part_mem.get_mensagem()
                msg_csv = wx.MessageBox(mensagem, 'Info', wx.OK | wx.ICON_INFORMATION)
                pass

            self.inicializacao_combos()
            pass

    # metodo com a inicializaçao do programa
    def inicializacao_combos(self):
        '''
            Descrição:
                Metodo para preencher as combos depois de carregar a bd

        '''
        lista_estabelecimentos = obj_cv2.listar_estabelecimento()
        lista_niveis_formacao = obj_cv2.listar_niveis_formacao()
        lista_cursos = obj_cv2.listar_cursos()

        self.e1_estabelecimento_combo.AppendItems(lista_estabelecimentos)
        self.e2_curso_combo.AppendItems(lista_cursos)
        self.e3_nivel_formacao_combo.AppendItems(lista_niveis_formacao)
        self.e4_nivel_formacao_combo.AppendItems(lista_niveis_formacao)

        self.e1_obter.Enable(True)
        self.e2_obter.Enable(True)
        self.e3_obter.Enable(True)
        self.e4_obter.Enable(True)

        pass

    def inicializacao_bd_thread(self):
        '''
            Descrição: 
                metodo para criar a base de dados recorrendo a threads

            Raises: 
                IOError: Para o caso de não existir base de dados

        '''
        try:
            open('lp_python_1213.db')

        except IOError:
            msg_csv = wx.MessageBox('Base de dados não existe.\nSerá criada uma nova.', 'Info', wx.OK | wx.ICON_INFORMATION)
            
            nome_ficheiro = obj_cv2.verificar_xls()

            if nome_ficheiro == False:
                msg_xls = wx.MessageBox('Ficheiro xls não existe na directoria!\nEscolha-o!', 'Info', 
                                      wx.OK | wx.ICON_INFORMATION)

                nome_ficheiro = self.openfile()
                obj_cv2.criar_base_dados_thread(nome_ficheiro)
                pass
            else:
                obj_cv2.criar_base_dados_thread(nome_ficheiro)
                pass

            progressMax = 11957
            dialog = wx.ProgressDialog("A criar bd", "Tempo restante", progressMax,
                    style= wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_REMAINING_TIME)
            keepGoing = True
            count = part_mem.get_status()
            while keepGoing and count < progressMax:             
                if count < progressMax:
                    count_temp = part_mem.get_status()
                    if count_temp == 0:
                        count = count + 1
                        keepGoing = dialog.Update(count)
                        pass
                    else:
                        count = part_mem.get_status()
                        keepGoing = dialog.Update(count)
                        pass
                    pass
                pass

            else:
                dialog.Destroy()
                pass

            if count == progressMax:
                mensagem = part_mem.get_mensagem()
                msg_csv = wx.MessageBox(mensagem, 'Info', wx.OK | wx.ICON_INFORMATION)
                pass
        
        else:
            msg_csv = wx.MessageBox('Base de dados já existe.\nPor favor carregue a base de dados', 'Info', wx.OK | wx.ICON_INFORMATION)
            pass

    def inicializacao_bd(self):
        '''
            Descrição: metodo para criar a base de dados sem recorrer a threads

            Raises: 
                IOError: Para o caso de não existir base de dados

        '''
        try:
            open('lp_python_1213.db')

        except IOError:
            msg_csv = wx.MessageBox('Base de dados não existe.\nSerá criada uma nova.', 'Info', wx.OK | wx.ICON_INFORMATION)

            mensagem = obj_cv2.criar_base_dados_v2('')

            if mensagem == 'Ficheiro xls não encontrado':
                msg_xls = wx.MessageBox('Ficheiro xls não existe na directoria!\nEscolha-o!', 'Info', 
                                     wx.OK | wx.ICON_INFORMATION)

                nome_ficheiro = self.openfile()
                mensagem2 = obj_cv2.criar_base_dados_v2(nome_ficheiro)

                if mensagem2 == 'Ficheiro xls não encontrado':
                    self.inicializacao_bd()
                    pass
                else:
                    msg_csv = wx.MessageBox(mensagem2, 'Info', wx.OK | wx.ICON_INFORMATION)
                    pass
                pass
            pass
        
        else:
            msg_csv = wx.MessageBox('Base de dados já existe.\nPor favor carregue a base de dados', 'Info', wx.OK | wx.ICON_INFORMATION)
            pass
        pass

# end of class ProjectFrame
if __name__ == "__main__":
    '''
        Descrição: main da interface

        Raises: 
            apanha a excepção criada pela não existencia de um argumento
    '''
    obj_cv2 = cv2.controladorv2()
    part_mem = cv2.memoria_partilhada()

    try:
        enable_threads = sys.argv[1]
        pass

    except:
        enable_threads = ''
        pass

    else:
        enable_threads = sys.argv[1]
        pass

    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    project_frame = ProjectFrame(None, -1, "")
    app.SetTopWindow(project_frame)
    project_frame.Show()
    app.MainLoop()